// 引入 http 模块用于创建 HTTP 服务器
const http = require('http');
// 引入 fs 模块用于文件系统操作
const fs = require('fs');
// 引入 path 模块用于处理文件路径
const path = require('path');

// 获取命令行参数（process.argv 第一个是 node 路径，第二个是脚本路径，所以从第三个开始取参数）
const args = process.argv.slice(2);
// 存储要读取的文件路径
let filePath;

// 判断是否传入了命令行参数（文件名称）
if (args.length > 0) {
  // 拼接当前目录与传入的文件名称，得到目标文件路径
  filePath = path.join(__dirname, args[0]);
} else {
  // 未传入参数，默认读取当前文件（fileReader3.js）的路径
  filePath = path.join(__dirname, 'fileReader3.js');
}

// 创建 HTTP 服务器
const server = http.createServer((req, res) => {
  // 使用 fs.createReadStream 创建可读流
  const readStream = fs.createReadStream(filePath, 'utf8');

  // 监听流的 'error' 事件（处理文件不存在等错误）
  readStream.on('error', (err) => {
    res.writeHead(404, { 'Content-Type': 'text/plain' });
    res.end(`错误：文件 ${filePath} 不存在或无法读取。`);
  });

  // 监听流的 'open' 事件（文件开始读取时触发）
  readStream.on('open', () => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
  });

  // 将流的数据通过管道（pipe）直接响应到客户端
  readStream.pipe(res);
});

// 服务器监听 8081 端口
server.listen(8081, () => {
  console.log('服务器已启动，监听端口 8081。请访问 http://localhost:8081');
});
/**
 * 思考 “流读取” 与 “直接文件读取” 的区别
 * 直接文件读取（如 fs.readFile）：
 * 会将整个文件内容一次性加载到内存，再进行操作。
 * 适合小文件：简单方便，无需关注流的复杂事件。
 * 缺点：若文件过大（如几百 MB 甚至 GB 级），会占用大量内存，可能导致内存溢出或程序卡顿。
 * 流读取（fs.createReadStream）：
 * 以 **“chunk（数据块）” 为单位 **，分批次读取文件，每批数据处理完后释放内存，再读取下一批。
 * 适合大文件：内存占用更高效，不会因文件过大而压垮内存。
 * 缺点：需要通过事件监听（如 data、end、error）来处理数据，代码逻辑相对复杂。
 */